/**
 * @file Command.hpp
 *
 * @date 19/12/2011
 * @author Tales 
 *
 */

#ifndef _MODEL_COMMAND_HPP_
#define _MODEL_COMMAND_HPP_

#include "../common/Color.hpp"

namespace yep
{

class PictureState;

/**
 * @brief Um comando a ser passado lançado por uma Tool ou pelo Editor.
 */
class Command
{
public:
	/**
	 * Construtor
	 * @param color a cor
	 * @param layer a camada
	 */
	Command(const Color &color, int layer);

	/**
	 * Destrutor
	 */
	virtual ~Command();

	/**
	 * @brief Executa o comando em um estado.
	 *
	 * É chamado apenas por Picture, que sempre faz um clone do estado anterior, portanto
	 * @b não é necessário clonar o estado passado.
	 * @param picture um estado recém-criado.
	 */
	virtual void execute(PictureState &picture) = 0;

	/**
	 * @brief retorna a cor
	 * @return cor
	 */
	const Color &getColor() const;

	/**
	 * Retorna a camada.
	 * @return int
	 */
	int getLayerIndex() const;

private:
	Color color;
	int layer;
};

} /* namespace yep */
#endif /* _MODEL_COMMAND_HPP_ */
